#include <stdio.h>
#include <stdlib.h>
#include <getch.h>
#include <stdbool.h>
#include <unistd.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "struct.h"
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>

typedef struct sockaddr* sockaddrp;
Msg_ctoc msg;
//定义全局的棋盘
char board[15][15];
//定义全局的光标坐标
char c_x=7,c_y=7;
//定义全局的角色
char  role='#';
//声明初始化棋盘函数
void board_init(void)
{
    for(int x=0;x<15;x++)
  	{
      	for(int y=0;y<15;y++)
       	{
        	board[x][y]='*';
       
       	}     
  	}
}

//声明显示棋盘函数
void board_show(void)
{
   //清理屏幕
   system("clear");
   //初始化光标坐标
   printf("\33[2J");
   //显示棋盘
   for(int x=0;x<15;x++)
    {
        for(int y=0;y<15;y++)
        {
            printf(" %c",board[x][y]);
        }
        printf("\n");
    }

}
//声明检查函数
bool board_check(void)
{
	int count =0;
 	for(int x=c_x-2,y=c_y-2;x>=0&&y>=0;x--,y--)
  	{
  		if (role !=board[x][y]) break;
   		count++;
  	}
 	for(int x=c_x,y=c_y;x<15&&y<15;x++,y++)
  	{
 		if (role !=board[x][y]) break;
      	count++;
  	}
 	if(count >= 4) return true;
 	count=0;
 //左上

 	for(int x=c_x,y=c_y-2;x>=0&&y>=0;x++,y--)
  	{
  		if (role !=board[x][y]) break;
   		count++;
  	}
 	for(int x=c_x-2,y=c_y;x<15&&y<15;x--,y++)
  	{
 		if (role !=board[x][y]) break;
      	count++;
  	}
 	if(count >= 4) return true;
 	count=0;
 
 //右上
 
 	for(int x=c_x-2,y=c_y-1;x>=0&&y>=0;x--,y)
  	{
  		if (role !=board[x][y]) break;
   		count++;
  	}
 	for(int x=c_x,y=c_y-1;x<15&&y<15;x++,y)
  	{
 		if (role !=board[x][y]) break;
      	count++;
  	}
 	if(count >= 4) return true;
 	count=0;
 
 //左右
 
  	for(int x=c_x-1,y=c_y-2;x>=0&&y>=0;x,y--)
  	{
  		if (role !=board[x][y]) break;
   		count++;
  	}
 	for(int x=c_x-1,y=c_y;x<15&&y<15;x,y++)
  	{
 		if (role !=board[x][y]) break;
      	count++;
  	}
 	if(count >= 4) return true;
 	return false;
 //上下
 
}

//声明落子函数
void get_key(void)
{
  	printf("==========请%c落子==========\n",role);
  	while(1)
  	{
      //设置光标位置
      	printf("\33[%hhd;%hhdH",c_x,c_y*2);
      	switch(getch())
      	{
       		case 183:c_x>1 && c_x--;continue;
       		case 184:c_x<15 && c_x++;continue;
       		case 185:c_y<15 && c_y++;continue;
       		case 186:c_y>1 && c_y--;continue;
       		case 10:
       		if('*'==board[c_x-1][c_y-1])
       		{
				board[c_x-1][c_y-1]=role;
				msg.acc.x = c_x-1;
				msg.acc.y = c_y-1;
					
       				return;
       		}
      	}
  	}
}

//声明切换角色函数
void change_role(void)
{
  if('@'==role)
  {
  role='#';
  
  }
  else if('#'==role)
  {
  role='@';
  }
 


}
int main()
{
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if(0 > sockfd)
	{
		perror("socket");
		return -1;
	}
	struct sockaddr_in addr = {AF_INET};
	addr.sin_port = htons(5565);
	addr.sin_addr.s_addr = inet_addr("192.168.2.114");
    //初始化棋盘

	int ret = bind(sockfd,(sockaddrp)&addr,sizeof(addr));
	struct sockaddr_in src_addr = {};
	socklen_t addr_len = sizeof(addr);

    board_init();
    while(1)
    {
    	recvfrom(sockfd,&msg,sizeof(msg),0,(sockaddrp)&src_addr,&addr_len);
       	board[msg.acc.x][msg.acc.y]='@';
    //显示棋盘
    board_show();

	if(msg.acc.k == 1)
	{
		printf("恭喜@获得胜利，游戏结束！！");
		break;
	}

    get_key();
	if(board_check())
	{
		msg.acc.k = 1;
	}
		sendto(sockfd,&msg,sizeof(msg),0,(sockaddrp)&src_addr,addr_len);
    	board_show();  
    	if(msg.acc.k == 1)
    	{
    
    	printf("恭喜#胜利，游戏结束!!!");
    	break;
    
    }
    
    }
	close(sockfd);
}


